/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import pe.com.cotelasa.common.dao.DaoImpl;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOCourier;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.entidad.Courier;

/**
 *
 * @author WINDOWS 7
 */
@SuppressWarnings("unchecked")
@Repository("daoCourier")
public class DAOCourierImpl extends DaoImpl<Courier, Integer> implements IDAOCourier, Serializable {
    
    @Autowired
    private SessionFactory sessionFactory;
    
    @SuppressWarnings("unchecked")
    @Override
    @Transactional
    public Collection<Courier> listarCouriersPorFiltro(Courier courier, Date fechaInicio, Date fechaFinal) throws DAOException {
        List<Courier> listaOrdenCS = new ArrayList<Courier>();
        try {
            sessionFactory.getCurrentSession().flush();
            Criteria query = sessionFactory.getCurrentSession().createCriteria(Courier.class)
                    .addOrder(Order.desc("id"))
                    .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                    .add(Restrictions.eq("idEmpresa", courier.getIdEmpresa()))
                    .add(Restrictions.like("courier", "%" + courier.getCourier() + "%"))
                    .add(Restrictions.like("consignatario", "%" + courier.getConsignatario() + "%"));
            
            if (courier.getTipoFlete() != '0') {
                query = query.add(Restrictions.like("tipoFlete", "%" + courier.getTipoFlete()+ "%"));
            }
            
            if (fechaInicio == null && fechaFinal == null) {
                listaOrdenCS = query.list();
            } else if (fechaInicio != null && fechaFinal != null) {
                listaOrdenCS = query.add(Restrictions.ge("fechac", fechaInicio)).add(Restrictions.le("fechac", fechaFinal)).list();
            } else if (fechaInicio == null) {
                listaOrdenCS = query.add(Restrictions.le("fechac", fechaFinal)).list();
            } else if (fechaFinal == null) {
                listaOrdenCS = query.add(Restrictions.ge("fechac", fechaInicio)).list();
            }

        } catch (Exception e) {
            throw new DAOException(e.getMessage(), e);
        }
        return listaOrdenCS;
    }
    
    @Override
    public List<Courier> obtenerCourierReporte(Courier courier) throws DAOException{
        sessionFactory.getCurrentSession().flush();

        Criteria query = sessionFactory.getCurrentSession().createCriteria(Courier.class)
                .addOrder(Order.desc("fechac"))
                .add(Restrictions.eq("estadoRegistro", ESTADO_REGISTRO.ACTIVO.getValor()))
                .add(Restrictions.eq("idEmpresa", courier.getIdEmpresa()))
                .add(Restrictions.le("fechac", UtilitarioFecha.toEndOfYear(UtilitarioFecha.obtenerAnio(courier.getFechac()))));
        return query.list();
    }
    
}
